package preguntas;


import java.io.File;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

import utilidades.FileUtilities;
import utilidades.PropertiesFile;

public class PreguntaPila {
	/**
	 * El metodo principal.
	 *
	 * @param args Los argumentos
	 * @throws IOException Señales de que una excepción de E / S se ha producido.
	 */
	public static void main(String[] args) throws IOException {
		
		
		
		
		Random rnd = new Random();
	
		
		File file;
		File fileCloze;
		File fileXml;
		
		int seed;
		int seedProperty;
		int stackSize;
		int numberOptions;
		int correctNumber;
		int incorrectNumber;
		
		EstrategiaPermutaciones estrategiaCaracteres=new EstrategiaPermutacionCaracteres();
		EstrategiaPermutaciones estrategiaOperaciones=new EstrategiaPermutacionOperaciones();
		
		double correctParameter;
		double score;
		double scoreCloze;
		
		String giftFormat="";
		String clozeFormat="";
		String xmlFormat="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n ";
		
		String property;
		
		String filename="Preguntas/Pilas/PreguntaPila.txt";
		String filenameCloze="Preguntas/Pilas/PreguntaPilaCloze.txt";
		String filenameXml="Preguntas/Pilas/PreguntaPilaXml.xml";
		
		String pregunta="";
		String text="";
		
		//boolean continuar=true;
	
		
		ArrayList<Character> array=new ArrayList<Character>();
		ArrayList<Character> corrects=new ArrayList<Character>();
		ArrayList<Integer>correctPositions=new ArrayList<Integer>();
		
		RespuestaGenerada result;
		RespuestaGenerada options;
		
		Properties properties = new PropertiesFile().getProperties();
		
		property=properties.getProperty("stackSize");
		stackSize=Integer.parseInt(property);
		
		property=properties.getProperty("numberOption");
		numberOptions=Integer.parseInt(property);
		
		property=properties.getProperty("correctParameter");
		correctParameter=Double.parseDouble(property);
		
		property=properties.getProperty("seedStack");
		seedProperty=Integer.parseInt(property);
		
		
		char lastLetter='A';
		
		
	   
	    
		for(int i=1;i<stackSize;i++)
		{
			
			lastLetter++;
		}
		
		file=FileUtilities.createFile(filename);
		fileCloze=FileUtilities.createFile(filenameCloze);
		fileXml=FileUtilities.createFile(filenameXml);
		
		
			 
			 correctNumber=0;
			 incorrectNumber=0;
			 lastLetter='A';
				
			 for(int i=0;i<stackSize;i++)
			 {
				array.add(  lastLetter++);
			 }
			 
			 if(seedProperty==-1)
				 seed= (int) java.lang.Math.round(Math.random()*999999999+0);
			 else
				 seed=seedProperty;
			 rnd.setSeed(seed);
			 lastLetter--;
			 
			 xmlFormat=xmlFormat+"<quiz>\r\n <question type=\"multichoice\">\r\n  <name>\r\n \t <text> Pregunta Pila seed="+seed+"</text> \r\n </name>\r\n";
			 giftFormat=giftFormat+" ::Pregunta Pila seed="+seed+" ::\r\n ";
					
			for(int i=1;i<=numberOptions;i++)
			{
				if(correctParameter>=rnd.nextDouble())
				{
					correctPositions.add( i);
					correctNumber++;
				}
				else
				{
					correctPositions.add(null);
					incorrectNumber++;
				}
				
			}
			
			if(correctNumber!=0 && incorrectNumber!=0)
			{
				
				giftFormat=giftFormat+"(seed= "+seed+")\r\n";
				pregunta=pregunta+"(seed= "+seed+")\n";
				
				text="Sobre una pila se realizan entremezcladas operaciones de apilar y desapilar. Los valores que se apilan son las letras de la A a la "+ lastLetter+", en ese orden. Al desapilar se imprime el valor.\n";
				pregunta=pregunta+ text;	
				giftFormat=giftFormat+text;
				clozeFormat=clozeFormat+text;
				xmlFormat=xmlFormat+"<questiontext format=\"moodle_auto_format\">\r\n \t<text>"+text;
				
				
			      
			   
				
				
				text="¿Cuál de las siguientes secuencias podra darse mediante este proceso?";
				pregunta=pregunta+text+"\n";
				giftFormat=giftFormat+text+"{\r\n";
				clozeFormat=clozeFormat+text+"\r\n";
				xmlFormat=xmlFormat+text+"</text>\r\n</questiontext>\r\n";
				
				xmlFormat=xmlFormat+"<generalfeedback format=\"moodle_auto_format\">\r\n\t   <text></text>\r\n   </generalfeedback>\r\n";
				xmlFormat=xmlFormat+"  <defaultgrade>1.0000000</defaultgrade>\r\n   <penalty>0.3333333</penalty>\r\n <hidden>0</hidden>\r\n   <single>false</single>\r\n <shuffleanswers>true</shuffleanswers>\r\n  <answernumbering>abc</answernumbering>\r\n <correctfeedback format=\"moodle_auto_format\">\r\n\t  <text></text>\r\n   </correctfeedback>\r\n";
				xmlFormat=xmlFormat+" <partiallycorrectfeedback format=\"moodle_auto_format\">\r\n\t <text></text> \r\n </partiallycorrectfeedback>\r\n  <incorrectfeedback format=\"moodle_auto_format\">\r\n\t <text></text>\r\n  </incorrectfeedback>\r\n";

			    
				
				score=(double)100/correctNumber;
				scoreCloze=(double)1/numberOptions;
				lastLetter='A';	
				for(int i=1,a=0;i<=numberOptions;i++,a++)
				{
					
					pregunta=pregunta+""+ lastLetter+") ";
					
					if(correctPositions.get(a)!=null)
					{	
						if (correctNumber==1)
						{
							giftFormat=giftFormat+"~%100% ";
							xmlFormat=xmlFormat+"<answer fraction=\""+100+"\" format=\"moodle_auto_format\">";
						}
						else
						{
							giftFormat=giftFormat+"~%"+score+"% ";
							xmlFormat=xmlFormat+"<answer fraction=\""+score+"\" format=\"moodle_auto_format\">\r\n\t";
						}
						result=estrategiaOperaciones.permute(array, rnd);
						giftFormat=giftFormat+result.getText()+" ";
						xmlFormat=xmlFormat+"<text>"+result.getText()+"</text>\r\n";
						clozeFormat=clozeFormat+"* "+result.getText()+": {"+scoreCloze+":MULTICHOICE:%100%VERDADERO~FALSO}\r\n\n";
						pregunta=pregunta+result.getText()+" ";
						
						
						pregunta=pregunta+"\n";
						if(result.getCorrect())
							corrects.add( lastLetter);
						xmlFormat=xmlFormat+"<feedback format=\"moodle_auto_format\">\r\n\t  <text> "+result.getFeedback()+"</text>\r\n  </feedback>\r\n </answer>\r\n";
						giftFormat=giftFormat+" #"+result.getFeedback();
						giftFormat=giftFormat+"\r\n";
					}else
					{
						if (correctNumber==1)
						{
							giftFormat=giftFormat+"~%-100% ";
							xmlFormat=xmlFormat+"<answer fraction=\"-100 \" format=\"moodle_auto_format\">\r\n\t";
						}
						else
						{
							giftFormat=giftFormat+"~%-"+score+"% ";
							xmlFormat=xmlFormat+"<answer fraction=\"-"+score+"\" format=\"moodle_auto_format\">\r\n\t";
						}
						options=estrategiaCaracteres.permute(array, rnd);
						while(options.getCorrect())
						{
							options=estrategiaCaracteres.permute(array, rnd);
						}
								
						giftFormat=giftFormat+options.getText()+" ";
						clozeFormat=clozeFormat+"* "+options.getText()+": {"+scoreCloze+":MULTICHOICE:VERDADERO~%100%FALSO}\r\n\n";
						xmlFormat=xmlFormat+"<text>"+options.getText()+"</text>\r\n";
						pregunta=pregunta+options.getText()+" ";
						
						pregunta=pregunta+"\n";
						xmlFormat=xmlFormat+"<feedback format=\"moodle_auto_format\">\r\n\t  <text> "+options.getFeedback()+"</text>\r\n  </feedback>\r\n </answer>\r\n";
						giftFormat=giftFormat+" #"+options.getFeedback();
						giftFormat=giftFormat+"\r\n";
						
					}				
					pregunta=pregunta+"";
					lastLetter++;
					
				}
				
				giftFormat=giftFormat+"}\r\n\n";
				clozeFormat=clozeFormat+"\r\n\n";
				xmlFormat=xmlFormat+"</question>\r\n</quiz>\r\n";
				
				FileUtilities.writeFile(file,giftFormat);
				FileUtilities.writeFile(fileCloze,clozeFormat);
				FileUtilities.writeFile(fileXml, xmlFormat);
				
				pregunta=pregunta+"LAS RESPUESTAS CORRECTAS SON:\n";
				pregunta=pregunta+corrects.toString()+"\n";
				
			
				Logger.getLogger("logger").log(Level.INFO,pregunta+"\n");//+"Pulsa s para salir cualquier otra para continuar");
			
			corrects.clear();
			array.clear();
			correctPositions.clear();
			
		}
	
	}
	
	
	
	/**
	 * Comprobar si el array pasado es una posible solucion cuando sea numerica.
	 *
	 * @param posibleSolucion Array con la posible solucion de la pila 
	 * @return true, Si es correcto
	 */
	public  boolean comprobarCorrectas(ArrayList<Integer> possibleSolution)
	{
		int number=0;
		int position=0;
		int lastLetter=0+possibleSolution.size()-1;
		boolean bigger=false;
		
		boolean correct=false;
		Deque<Integer> stack = new ArrayDeque<Integer>();

		ArrayList<Integer>aux=new ArrayList<Integer>();
		
		int i=0;
		int taken=0;
		boolean finish=false;
		while(!finish)
		{
			while(possibleSolution.get(position)>=number)
			{
				stack.push(number);
				number++;
				
			}
		
			if(possibleSolution.get(0)==lastLetter)
			{
				bigger=true;
			}
			for(int j=0;j<possibleSolution.size();j++)
			{
				if(possibleSolution.get(j)>possibleSolution.get(i))
				{
					position=j;
					if(possibleSolution.get(position)==lastLetter)
					{
						bigger=true;
					}
					break;
				}
			}
			while(possibleSolution.get(position)>possibleSolution.get(i))
			{
				taken=stack.pop();
				aux.add(taken);
				i++;
			}
			position=i;
			if(bigger)
			{
				while(number<=lastLetter)
				{
					stack.push(number);
					number++;
				}
				
				while(!stack.isEmpty())
				{
					aux.add(stack.pop());
				}
			}
			if(stack.isEmpty())
			{
				finish=true;
			}
		}
	
		
		
		if(aux.equals(possibleSolution))
		
			correct=true;
		else
			correct=false;
		
		
		return correct;
	}
	
	
	
	
	


}
